let brain = require("brain.js");
let fs = require("fs");
let data = require("../res/res.json");
let path = require("path");

// 配置神经网络
const config = {
  hiddenLayers: [128, 64, 32], // 改为三层隐藏层，增强特征提取能力
  activation: "leaky-relu", // 使用更主流的ReLU激活函数
  learningRate: 0.05, // 降低初始学习率
  decayRate: 0.999, // 减缓学习率衰减速度
  regularization: "l2", // 添加L2正则化
  regularizationRate: 0.0001, // 正则化系数
};

const net = new brain.NeuralNetwork(config);

// 模拟训练数据（需替换为真实历史数据）
const trainingData = [];
for (let item in data) {
  let o = item - 0 + 1;
  if (data[o] && item >= 2023000) {
    trainingData.push({
      input: data[item].wzjred.map((v) => v / 100),
      output: data[o].red.map((i) => i / 100),
    });
  }
}

// 训练参数
const trainConfig = {
  iterations: 40000,
  errorThresh: 0.000001,
  log: true,
  logPeriod: 500,
  callback: (res) => {
    net.trainOpts.learningRate *= config.decayRate; // 动态调整学习率
    // 添加早停机制
    if (res.iterations > 5000 && res.error < 0.0001) {
      return true; // 提前终止训练
    }
  },
};

// 开始训练
console.time("训练耗时");
const stats = net.train(trainingData, trainConfig);
console.timeEnd("训练耗时");

const jsonstr = net.toJSON();
// net.fromJSON(json);

fs.writeFile(
  path.join(__dirname, "./ds-model.json"),
  JSON.stringify(jsonstr, null, 2),
  { flag: "w" },
  () => {}
);

// 模型评估
console.log(`
训练结果统计:
- 训练误差: ${stats.error.toFixed(5)}
- 迭代次数: ${stats.iterations}
- 最终学习率: ${net.trainOpts.learningRate.toFixed(6)}
`);

if (stats.error > 0.01) {
  console.warn("警告：训练误差偏大，模型可能欠拟合");
} else if (stats.error < 0.0001) {
  console.warn("警告：训练误差过小，模型可能过拟合");
}

if (net.trainOpts.learningRate > 0.0001) {
  console.warn("警告：最终学习率偏大，可能需要增加训练轮次或调整衰减率");
}
